home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / txf / src / txform2.c < prev    next >
C/C++ Source or Header  |  1994-09-17  |  7KB  |  369 lines

  1. /*====================================================================
  2.  *
  3.  * TXF textfile format module 2
  4.  *
  5.  *====================================================================
  6.  *                                   copyright(C) 1992-1994 T.Nakatani
  7.  *====================================================================
  8.  */
  9. #include "txf.h"
  10.  
  11. void setleft()
  12. {
  13.     int chr = NUL, pos = 0;
  14.     long iy = 1L;
  15.     char *spbuf;
  16.  
  17.     tfileopen(4);
  18.  
  19.     spbuf = malloc(base + 1);
  20.     if (spbuf == NULL) {
  21.         errexit("out of memory");
  22.     }
  23.     *spbuf = NUL;
  24.     while (fsize > 0) {
  25. #ifdef DEBUG
  26.         if (viewmode > 10) {
  27.             printf("setleft->remain=%ld  \r", fsize);
  28.         }
  29. #endif
  30.         while (levelchk(iy)) {
  31. #ifdef DEBUG
  32.             if (viewmode > 10) {
  33.                 printf("setleft->remain2=%ld  \r", fsize);
  34.             }
  35. #endif
  36.             chr = NUL;
  37.             while ((chr != LF) && (fsize >= 0)) {
  38. #ifdef DEBUG
  39.                 if (viewmode > 10) {
  40.                     printf("setleft->remain3=%ld  \r", fsize);
  41.                 }
  42. #endif
  43.                 chr = getc(input);
  44.                 fsize--;
  45.                 if (fsize >= 0) {
  46.                     putc((char)chr, output);
  47.                 }
  48.                 if (fsize <= 0) {
  49.                     break;
  50.                 }
  51.                 if (chr == LF) iy++;
  52.             }
  53.             pos = 0;
  54.             *spbuf = NUL;
  55.             if (fsize <= 0) {
  56.                 break;
  57.             }
  58.         }
  59.         if (fsize <= 0) {
  60.             fputs(spbuf, output);
  61.             break;
  62.         }
  63.         if (pos >= base) {
  64.             while ((chr != LF) && (fsize >= 0)) {
  65.                 chr = getc(input);
  66.                 fsize--;
  67.                 if (fsize >= 0) putc((char)chr, output);
  68.                 if (chr == LF) iy++;
  69.             }
  70.             pos = 0;
  71.             *spbuf = NUL;
  72.         }
  73.         chr = getc(input);
  74.         fsize--;
  75.         if (chr == CR) {
  76.             fputs(spbuf, output);
  77.             *spbuf = NUL;
  78.             putc(chr, output);
  79.             chr = getc(input);
  80.             fsize--;
  81.             putc(chr, output);
  82.             pos = 0;
  83.             iy++;
  84.         }
  85.         else if (chr == 0x20) {
  86.             pos++;
  87.             strcat(spbuf, " ");
  88.         }
  89. /*        else if (chr == TAB) {
  90.             pos = ((pos / tabsize) + 1) * tabsize;
  91.             strcat(spbuf, "\t");
  92.         }
  93. */
  94.         else {
  95.             if (pos < base) {
  96.                 fputs(spbuf, output);
  97.                 pos = 0;
  98.                 *spbuf = NUL;
  99.             }
  100.             if (fsize >= 0) putc((char)chr, output);
  101.             while ((chr != LF) && (fsize >= 0)) {
  102.                 chr = getc(input);
  103.                 fsize--;
  104.                 if (fsize >= 0) putc((char)chr, output);
  105.                 if (fsize <= 0) break;
  106.                 if (chr == LF) iy++;
  107.             }
  108.         }
  109.     }
  110.  
  111.     fflush(output);
  112.     fclose(output);
  113.     fclose(input);
  114.     free(spbuf);
  115.     tmpinfile = ((tmpinfile > 0) ? 0 : 1);
  116. #ifdef DEBUG
  117.     if (viewmode > 2) {
  118.         fprintf(stderr, "Info:tmpinfile = %d\n",tmpinfile);
  119.     }
  120. #endif
  121. }
  122.  
  123. void setleft0()
  124. {
  125. /*    unsigned long i;    */
  126.     int tmpleft = maxc, chr, bs;
  127.  
  128.     tfileopen(5);
  129.  
  130.     fclose(output);
  131.  
  132.     bs = 0;
  133.     while (fsize > 0) {
  134.         chr = getc(input);
  135.         fsize--;
  136.         if (chr == 0x20) {
  137.             bs++;
  138.         }
  139.         else if (chr == TAB) {
  140.             bs = ((bs / tabsize) + 1) * tabsize;
  141.         }
  142.         else {
  143.             if (bs < tmpleft)
  144.                 tmpleft = bs;
  145.             bs = 0;
  146.             while (chr != LF) {
  147.                 chr = getc(input);
  148.                 fsize--;
  149.                 if (fsize <= 0) {
  150.                     break;
  151.                 }
  152.             }
  153.         }
  154.     }
  155.     fclose(input);
  156.     base = tmpleft;
  157.  
  158. }
  159.  
  160. int putspace(int num, FILE *file)
  161. {
  162.     int j;
  163.  
  164.     for (j = 0; j < num; j++) putc(' ', file);
  165.     return (num);
  166. }
  167. /*
  168. int putspace(int num, unsigned int handle)
  169. {
  170.     int j;
  171.     char *sp;
  172.  
  173.     sp = malloc(num);
  174.     for (j=0; j<num; j++) *(sp+j) = ' ';
  175.     write(handle, sp, num);
  176.     free(sp);
  177.     return (num);
  178. }
  179. */
  180.  
  181. int findret(int ox, int iy, char far *rptr)
  182. {    /*    改行コードを発見した時、連続処理するための条件    */
  183.  
  184.     int retf = 0;
  185.  
  186.     switch(*(rptr+2)) {
  187.     case 0x81:
  188.         if (*(rptr+3) != 0x40) break;
  189.     case 0x20:
  190.     case TAB:
  191.     case CR:
  192.         retf = 1;
  193.     }
  194.     if (putret(ox, rptr+2L) && (ox >= (right -3))) {
  195.         retf = 1;
  196.     }
  197.     if (quoteflg) {
  198.         if (quotechk(rptr+2L)) {
  199.             retf = 1;
  200.         }
  201.     }
  202.     if (levelchk(iy+1)) {
  203.         retf = 1;
  204.     }
  205.     if (ishflg) {
  206.         if (ishchk(rptr+2L) > 0) {
  207.             retf = 1;
  208.             ishline = 0;
  209.         }
  210.     }
  211.     return (retf);
  212. }
  213.  
  214. int putret(int ox, char far *rptr)
  215. {    /* ),.>}]。、!? 、。,.)]}>」」》』】!?    禁足処理    */
  216.  
  217.     unsigned int bchr = ((*(rptr-2L) << 8) | *(rptr-1L));
  218.     unsigned int chr = ((*(rptr) << 8) | *(rptr+1L));
  219.     int retf = 1, pl = 0, pf = 0;
  220.  
  221.     if (ox <= right) retf = 0;
  222.  
  223.     if (jiszen(chr)) {
  224.         if (ox == right) retf = 1;
  225.         if (jstrchr(kf, chr) != NULL) {
  226.             retf = 1;
  227.             pf = 1;            /* kfに存在フラグ */
  228.         }
  229.     }
  230.     else {
  231.         if (jstrchr(kf, *rptr) != NULL) {
  232.             retf = 1;
  233.             pf = 1;
  234.         }
  235.     }
  236.  
  237.     if (jiszen(chr)) {
  238.         if (jstrchr(kl, chr) != NULL) {
  239.             retf = 0;
  240.             pl = 1;
  241.         }
  242.     }
  243.     else {
  244.         if (jstrchr(kl, *rptr) != NULL) {
  245.             retf = 0;
  246.             pl = 1;
  247.         }
  248.     }
  249.  
  250.     if ((pf == 1) && (pl == 1)) {
  251.         if (jiszen(bchr)) {
  252.             if ((jstrchr(kl, bchr) != NULL) && (jstrchr(kf, bchr) != NULL)) {
  253.                 retf = 0;
  254.             }
  255.             else {
  256.                 retf = 1;
  257.             }
  258.         }
  259.         else {
  260.             if ((jstrchr(kl, *(rptr-1L)) != NULL) &&
  261.                     (jstrchr(kf, *(rptr-1L)) != NULL)) {
  262.                 retf = 0;
  263.             }
  264.             else {
  265.                 retf = 1;
  266.             }
  267.         }
  268.     }
  269.  
  270.     if (jiszen(chr) && (ox >= maxc)) retf = 1;
  271.     if (retf || (ox > maxc)) {
  272.         return (TRUE);
  273.     }
  274.     else {
  275.         return(FALSE);
  276.     }
  277. }
  278.  
  279. int linelen(char far *ptr)
  280. {
  281.     int len = 0;
  282.  
  283.     while ((*(ptr+(long)len) != CR) && (*(ptr+(long)len) != NUL)) len++;
  284.     return (min(len, remainbyte()));
  285.  
  286. }
  287.  
  288. int levelchk(unsigned long int line)
  289. {
  290.     if (line < starttxf) return (1);
  291.     if ((endtxf > 0) && (line > endtxf)) return (1);
  292.  
  293.     return (0);
  294. }
  295.  
  296. int ishchk(char far *ptr)
  297. {
  298.     if (ishline == 0) {
  299.         if (matchstr(ishhead1, ptr)) {
  300.             far_strncpy(linestr, far_strstr(ptr, " ) [ ") + 5L, 6);
  301.             linestr[6] = NUL;
  302.             ishmax = atoi(linestr);
  303. /*            sscanf(far_strstr(ptr, " ) [ "), " ) [ %d", &ishmax); */
  304.             if (ishmax > 0) {
  305.                 ishptr = ishchr;
  306.                 ishline = 1;
  307.                 goto RETL;
  308. /*                return (ishline);    */
  309.             }
  310.         }
  311.         else {
  312.             goto RET0;
  313. /*            return (0);    */
  314.         }
  315.     }
  316.     else if (ishline < 4) {
  317.         if ((linelen(ptr) == 78) && (*ptr == '!')) {
  318.             ishline++;
  319.             goto RETL;
  320. /*            return (ishline);    */
  321.         }
  322.         else {
  323.             goto RET0;
  324. /*            return (0);    */
  325.         }
  326.     }
  327.     else if (ishline == ishmax) {
  328.         ishline = 0;
  329.         ishmax = 0;
  330.         goto RET0;
  331. /*        return (0);    */
  332.     }
  333.     else if ((ishline == (ishmax-3)) && (*ptr == '。')) {
  334.         ishline++;
  335.         goto RETL;
  336. /*        return (ishline);    */
  337.     }
  338.     else if ((ishline == (ishmax-2)) && (*ptr == '」')) {
  339.         ishline++;
  340.         goto RETL;
  341. /*        return (ishline);    */
  342.     }
  343.     else if ((linelen(ptr) == 78) && (*ptr == *ishptr)) {
  344.         ishline++;
  345.         ishptr++;
  346.         if (*ishptr == NUL) {
  347.             ishptr = ishchr;
  348.         }
  349.         goto RETL;
  350. /*        return (ishline);    */
  351.     }
  352.     else {
  353.         sprintf(ishhead2, "--- ^2 (%d/%d) ---", ishline+1, ishmax);
  354.         if (matchstr(ishhead2, ptr)) {
  355.             ishline++;
  356.             goto RETL;
  357. /*            return (ishline);    */
  358.         }
  359.     }
  360. RET0:
  361. /*    printf("ISHCHK(00):%c%c\n", *ptr, *(ptr+1));    */
  362.     return (0);
  363. RETL:
  364. /*    printf("ISHCHK(%d):%c%c\n", ishline, *ptr, *(ptr+1));    */
  365.     return (ishline);
  366.  
  367. }
  368.  
  369.